package shop.local.valueobjects;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

import shop.local.domain.exceptions.ArtikelExistiertBereitsException;
import shop.local.domain.exceptions.ArtikelExistiertNichtException;

public class ArtikelListe extends HashMap<Integer, Artikel> {
    
    private static final long serialVersionUID = 1652849323161576353L;

    public ArtikelListe() {}
      
	public Artikel gibArtikel(int artNr) throws ArtikelExistiertNichtException  {
		boolean existiert = false;
		for (int i = 1; i <= this.size(); i++) {
			if (this.get(i).getNummer() == artNr) {
				existiert = true;
				return this.get(i);
			}
		}
		if (!(existiert)) {
			throw new ArtikelExistiertNichtException(artNr);
		}
		return null;
	}



	public void einfuegen(Artikel a) throws ArtikelExistiertBereitsException {
		
		//Herr Teschkes Ansatz/Loesung fuer implementierung per HashSet
/*		Set<Artikel> wk = new HashSet<Artikel>();
		
		if (wk.contains(a)) {
			for (Artikel enthaltenerArtikel : wk) {
				if (enthaltenerArtikel.equals(a)) {
					int aktBestand = enthaltenerArtikel.getBestand();
					enthaltenerArtikel.setBestand(aktBestand + a.getBestand());
				}
			}
		} else {
			wk.add(a);
		}*/

		
		if (this.size() == 0) {
			this.put(1, a);
		}
		else {
			for (int i = 1; i <= this.size(); i++) {
				if (this.get(i).equals(a))
					throw new ArtikelExistiertBereitsException(a, " - in 'einfuegen()'");
			}
			this.put(this.size() + 1, a);
		}
	}
	
	public boolean loeschen(int artNr) throws ArtikelExistiertNichtException {
		boolean geloescht = false;
		for (int i = 1; i <= this.size(); i++) {
				if (this.get(i).getNummer() == artNr) {
					this.remove(i);
					geloescht = true;
				}
		}
		if (!(geloescht)) {
			throw new ArtikelExistiertNichtException(artNr);
		}
		return geloescht;
	}

	
	// toString Methode Ueberschrieben
	public String toString() {
		String result = "";
		String zeilenEnde = System.getProperty("line.separator");
		for (int i = 1; i <= this.size(); i++) {
			result = result + this.get(i) + zeilenEnde;
		}
		return result;
	}
	

	public ArtikelListe nachNummerSortieren() {
		int[] nummern = new int[this.size()];
		for (int x = 0; x < nummern.length; x++){
			nummern[x] = this.get(x+1).getNummer();
		}
		java.util.Arrays.sort( nummern );
		ArtikelListe listeNummern = new ArtikelListe();
		for (int x = 0; x < nummern.length; x++) {
			Artikel a = null;
			try {
				a = this.gibArtikel(nummern[x]);
			} catch (ArtikelExistiertNichtException e1) {
				e1.printStackTrace();
			}
			try {
				listeNummern.einfuegen(a);
			}
			catch (ArtikelExistiertBereitsException e) {
				e.printStackTrace();
			}
		}
		return listeNummern;
	}
	
	public ArtikelListe nachNameSortieren() {
		// +1, da unsere Listen bei 1 und nicht bei 0 beginnen
		Artikel[] namen = new Artikel[this.size()];
		
		for (int x = 0; x < namen.length; x++){
			namen[x] = this.get(x+1);
		}
		
		java.util.Arrays.sort( namen );
		
		ArtikelListe listeName = new ArtikelListe();
		
		for (int x = 0; x < namen.length; x++) {
			Artikel a = namen[x];
			try {
				listeName.einfuegen(a);
			}
			catch (ArtikelExistiertBereitsException e) {
				e.printStackTrace();
			}
		}
		
		return listeName;
	}
	
}
